package com.sxj.corejava.code08_常用类.内部类;

/**
 * @author 石小俊
 * @date 2025年02月18日
 */
public class Test02_局部内部类 {

    public static void main(String[] args) {
        // 在此处无法实例化局部内部类
//        Inner2 inner2 = new Inner2();
        Outer2 outer2 = new Outer2();
        outer2.show();
    }

}

class Outer2 {
    private String name = "admin";
    private int age = 18;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void show() {
        String phone = "13812345678";
        // 局部内部类:定义在方法中的内部类
        class Inner2 {
            private String name = "alice";
            private String gender = "女";

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public String getGender() {
                return gender;
            }

            public void setGender(String gender) {
                this.gender = gender;
            }

            public void print() {
                System.out.println("*****************内部类方法*****************");
                // 内部类方法访问外部类属性时,当属性名不重名时,可以直接访问
                System.out.println("外部类age:" + age);
                // 当重名时,默认访问的是内部类属性
                // 可以通过外部类对象.属性名来访问或者外部类类名.this.属性名来访问
                Outer2 outer2 = new Outer2();
                System.out.println("外部类name:" + outer2.name);
                System.out.println("外部类name:" + Outer2.this.name);
                System.out.println("内部类name:" + name);
                System.out.println("内部类gender:" + gender);
                // 访问内部类所在的外部类方法中的属性
                // 在JDK8之前,访问的属性必须被final修饰
                // JDK8之后,可以省略final
                // 虽然JDK8之后可以省略final,但是该属性会默认被final修饰
                System.out.println("内部类所在的外部类方法中的属性:" + phone);
                // 由于被final修饰的属性的值不能更改,因此此时phone的值不能修改
                // phone = "13912345679";
            }

        }
        System.out.println("*****************内部类所在的外部类方法*****************");
        // 在方法中实例化内部类,正常实例化即可
        // 局部内部类只能在内部类所在的方法中进行实例化
        Inner2 inner2 = new Inner2();
        // 在内部类所在的外部类方法中访问内部类成员
        inner2.print();
        System.out.println(inner2.name);
        System.out.println(inner2.gender);
    }

    public void test() {
        // 在此处无法实例化局部内部类
//        Inner2 inner2 = new Inner2();
    }
}
